#ifndef DBCONNECTION_H
#define DBCONNECTION_H
#include<QtGui>
#include<QSqlDatabase>
#include"authorization.h"

class QString;
class QSqlDatabase;
/*! \class  DbConnection
    \brief Класс обеспечивающий подключение к базе данных и выполнение sql запросов. 
*/
class DbConnection : public QObject, public Authorization
{
    Q_OBJECT;
public:
/*! 
    Структура сожержит в себе настройки подключения к базе данных. 
*/
    struct Parameters
    {
       QString host, DbName, driver, user, password, schema;
       int port;
    };
/*! \class  QueryResult
    \brief Содержит в себе результат выполнения sql запроса в виде таблицы. Тип каждой ячейки: QVariant. 
*/
   class QueryResult
   {
   public:
/*!
    Конструктор класса.
*/   
     QueryResult();
/*!
    Конструктор класса.
*/     
     QueryResult(const QVector < QVector < QVariant> >&  result);
/*!
    Конструктор класса.
*/     
     QueryResult(const QString& errorMessage);
/*!
    Конструктор класса.
*/     
     QueryResult(const QVector < QVector < QVariant> >&  result, const QStringList &fields,
                 const int&RAF);
/*!
    Возвращает true в случае успешного выполнения запроса.
*/
      bool success() const;
/*!
    Возвращает количество строк результата запроса.
*/      
      int rows() const;
/*!
    Возвращает количество столбев результата запроса.
*/      
      int columns() const;
      int rowsAffected() const;
/*!
    Возвращает содержимое ячейки таблицы.
    \param row  индекс строки.
    \param col  индекс столбца.
*/      
      QVariant at(const int& row, const int& col) const;
/*!
    Возвращает название поля результата запроса.
    \param index  индекс столбца.
*/      
      QString fieldName(const int&index) const;
/*!
    Возвращает ошибку выполнения запроса.
*/      
      QString errorMessage() const;

   private:
      QVector < QVector < QVariant> > res;
      bool ok;
      QString mes;
      QStringList FieldsName;
      int rAf;
   };
/*!
    Конструктор класса.
    \param params параметры подключения к базе данных   
*/ 
    DbConnection(const Parameters & params);
/*!
    Конструктор класса.
*/ 
    DbConnection();
/*!
    Деструктор класса.
*/     
    ~DbConnection();
/*!
    Возвращает пароль.
*/    
    QString password();
/*!
    Возвращает хост.
*/    
    QString host();
/*!
    Возвращает имя базы данных.
*/    
    QString dbName();
/*!
    Возвращает имя пользователя.
*/    
    QString user();
/*!
    Возвращает пимя драйвера подключения.
*/    
    QString driver() const;
/*!
    Возвращает порт.
*/    
    int port();
    bool login(const QString& name, const QString& pass);
    QString errorMessage();
/*!
    Закрывает соединение с СУБД.
*/    
    void closeDb();
/*!
    Возвращает true если соединение с базой данных открыто.
*/    
    bool isDbOpen();
/*!
    Возвращает true если авторизация прошла успешно.
*/    
    bool isLogin(){return logiN;};
    QSqlError lastError() const;
public slots:
/*!
    Выполняет sql запрос, возвращает результат запроса.
    \param sql sql запрос.
*/
    QueryResult  execute(const QString& sql);
/*!
    Устанавливает параметры подключения к базе данных, после чего пытается подключиться к базе данных.
*/        
    void setParametersAndLogin(const DbConnection::Parameters &params);
    void setParameters(const DbConnection::Parameters &params);
signals:
/*!
    Испускается после выполнения запроса. Возвращает результат.
*/
    void results(const DbConnection::QueryResult &records);
/*!
    Испускается при смене имени пользователя.
    \param Name новое имя пользователя.
*/    
    void changeConnectionName(const QString &Name);
    void busy(const bool &arg);
    void status(const int &arg);
private:
    QSqlDatabase db;
    bool logiN;
    DbConnection::Parameters prm;    
};
#endif // DBCONNECTION_H
